#include "Real.hpp"
#include "utils.hpp"

/* 
 * Método de Gregory para calcular PI
 * ==================================
 * Cálculo:
 * PI / 4 = Sum_n=0^inf[ (-1)^n / (2n+1) ]
 *
 */
template<typename T>
T gregory( Iteration iterations )
{

	T    result = 0.0f; // resultado
	bool add    = true; // true si próxima operación es una suma

	// sumatoria desde 0 a la cantidad de iteraciones elegida
	for( Iteration n = 0 ; n < iterations ; n++ )
	{

		// calcula el término n de la serie
		T term = 4.0f/static_cast<T>(2*n+1);

		// este if juega el papel del (-1)^n y suma o resta
		// según el caso correspondiente
		if( add )
			result += term;
		else
			result -= term;

		// cambia la próxima operación de suma a resta
		add = !add;

	}

	return result;

}

int main(int argc, char** argv)
{

	return run( &gregory<Real>, 5000, argc, argv );

}

